import subprocess
import argparse
import sys # 用于 sys.exit

# 创建命令行参数解析器

parser = argparse.ArgumentParser(description='测试 sum_up 可执行文件。')

parser.add_argument('--executable',

                    help='sum_up 可执行文件的完整路径',

                    required=True) # 明确指定 executable 为必需参数

parser.add_argument('--short',

                    default=False,

                    action='store_true',

                    help='运行一个较短的测试 (1到100求和)')

args = parser.parse_args()



def execute_cpp_code(integers_list):

    """

    执行 C++ 可执行文件并返回其输出的整数值。

    """

    try:
        # 使用 subprocess.check_output 执行命令
        # input 参数用于传递标准输入,这里不需要
        # text=True 用于将输出解码为字符串
        # check=True 表示如果命令返回非零退出码,将抛出 CalledProcessError
        result_bytes = subprocess.check_output([args.executable] + integers_list, capture_output=True, text=True)
        return int(result_bytes.strip()) # 移除空白字符并转换为整数
    except subprocess.CalledProcessError as e:
        print(f"错误: 执行 C++ 代码失败。命令: {e.cmd}, 退出码: {e.returncode}, 输出: {e.output}", file=sys.stderr)
        sys.exit(1) # 退出并指示失败
    except ValueError:
        print(f"错误: 无法将 C++ 输出 '{result_bytes.strip()}' 转换为整数。", file=sys.stderr)
        sys.exit(1) # 退出并指示失败
    except Exception as e:
        print(f"发生意外错误: {e}", file=sys.stderr)
        sys.exit(1) # 退出并指示失败





if args.short:

    # 短模式测试：求和 1 到 100

    # 生成 '1', '2', ..., '100' 的字符串列表

    integers_to_sum = [str(i) for i in range(1, 101)]

    expected_result = 5050 # 1到100的和

    test_name = "Python 短测试"

else:

    # 长模式测试：求和 1 到 1000

    # 生成 '1', '2', ..., '1000' 的字符串列表

    integers_to_sum = [str(i) for i in range(1, 1001)]

    expected_result = 500500 # 1到1000的和

    test_name = "Python 长测试"



print(f"正在运行 {test_name}...")

actual_result = execute_cpp_code(integers_to_sum)



try:

    assert actual_result == expected_result, f'{test_name} 失败: 预期 {expected_result}, 实际 {actual_result}'

    print(f"{test_name} 成功: {actual_result} == {expected_result}")

    sys.exit(0) # 成功退出

except AssertionError as e:

    print(e, file=sys.stderr) # 打印断言失败信息到标准错误

    sys.exit(1) # 失败退出